Descripción
La sepáis ocasiona en el mundo más de mil muertes cada dÃa, muchos de
estos pacientes adquieren la infección estando hospitalizados y
constituye la complicación intrahospitalaria más frecuente. La infección
de pacientes por las manos de contaminadas del personal de salud es una
de las formas de diseminación de los agentes infecciosos. La higiene de
las manos es el factor individual más importante para el control de las
infecciones, es difÃcil entender que un hecho tan rutinario en la
práctica de la medicina, como lavarse las manos previo a examinar a un
paciente, haya causado tanta controversia en la época de 1800.
A principios de la década de 1840 se descubrió una enfermedad mortal
que afectaba a las mujeres que acababan de dar a luz, cerca del 10% de
las mujeres morÃan a causa de esta enfermedad y el origen provenÃa de
las manos contaminadas del personal médico que atendÃa los partos.
En este proyecto, vamos analizar los datos que demuestran la
importancia del lavado de manos, identificando anomalÃas en los
procedimientos médicos.
1. Conociendo los datos
1.1 Cargue el paquete tidyverse
install.packages("plotly")
Error in install.packages : Updating loaded packages
1.2 Lea el archivo death_handwashing.csv usando read_csv y asÃgnelo
a una variable.
deaths_handwashing <- read_csv("deaths_handwashing.csv")
Rows: 12 Columns: 4
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
chr (1): clinic
dbl (3): year, births, deaths
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
1.3 Imprima la variable del inciso 1.2
deaths_handwashing
2 El alarmante número de muertes
La tabla anterior muestra el número de mujeres que dieron a luz
durante los años 1841 a 1846 en una ciudad al noreste de Austria, en dos
clÃnicas en particular. Notará que dar a luz era muy peligroso; un
número alarmante de mujeres murió como resultado del parto. Vemos esto
con mayor claridad si observamos la proporción de muertes con respecto
al número de mujeres que dieron a luz.
2.1 Use mutate para agregar una nueva columna que se calculará como
la proporción de muertes por número de nacimientos.
deaths_handwashing <- deaths_handwashing %>%
mutate(proportion_deaths = deaths / births)
2.2 Imprima el dataset con lanueva variable.
deaths_handwashing %>%
arrange(desc(proportion_deaths))
3 Muerte en las clÃnicas
Si ahora graficamos la proporción de muertes en la clÃnica 1 como en
la clÃnica 2, veremos un patrón curioso.
3.1 Utilice ggplot para hacer una gráfica lineal. Tome de referencia
la columna creada en el inciso 2.1 (eje) versus la variable year (eje
x).
ggplot(deaths_handwashing, aes(x = year, y = proportion_deaths)) +
geom_line()

3.2 Utilice la variable clinic para definir un color distinto en la
estética de la gráfica.
ggplot(deaths_handwashing, aes(x = year, y = proportion_deaths, color = clinic)) +
geom_line()

3.3 Por último, imprima la gráfica y exponga su punto de vista.
ggplotly(ggplot(deaths_handwashing, aes(x = year, y = proportion_deaths, color = clinic)) +
geom_line() +
labs(title = "Proporción de muertes en las clÃnicas 1 y 2",
x = "Año",
y = "Proporción de muertes")
)
Observaciones
La proporción de muertes en la ClÃnica 1 es mucho más alta que en la
ClÃnica 2. A partir del año 1842 la proporción de muertes en ambas
clÃnicas empezó a disminuir de manera significativa. En el año 1845 la
proporción de muertes tuvo un aumento en ambas clÃnicas.
4 Comienza el lavado de manos
¿Por qué la proporción de muertes es mucho más alta en la ClÃnica 1?
La única diferencia en ambas clÃnicas era que muchos estudiantes de
medicina trabajaban en la ClÃnica 1, mientras que en la ClÃnica 2 no
habÃa tantos. Otro dato interesante es que los médicos que atendÃan
partos solo se encargaban de esa función, mientras que los estudiantes
también pasaban tiempo en las salas de autopsias examinando
cadáveres.
Se empezó a sospechar que algo en los cadáveres, propagado de las
manos de los estudiantes de medicina, causaba la enfermedad. Entonces,
en un intento desesperado por detener las altas tasas de mortalidad, se
decretó: ¡Lávese las manos en todo momento!
4.1 Cargue los datos mensuales de la ClÃnica 1 para ver si el lavado
de manos tuvo algún efecto, para esto lea el archivo deaths_clinic1.csv
y asÃgnelo a una nueva variable.
deaths_clinic1 <- read_csv("deaths_clinic_1.csv")
Rows: 98 Columns: 3
── Column specification ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Delimiter: ","
dbl (2): births, deaths
date (1): date
ℹ Use `spec()` to retrieve the full column specification for this data.
ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message.
4.2 Utilice ggplot para hacer una gráfica lineal.
La gráfica tendrá la caracterÃstica de ser dual (dos ejes Y). Para el
eje X se utilizará la variable date y para Y1 y Y2, serán births y
deaths respectivamente.
ggplot(deaths_clinic1, aes(x = date)) +
geom_line(aes(y = births, color = "Nacimientos")) +
geom_line(aes(y = deaths, color = "Muertes")) +
scale_y_continuous(sec.axis = sec_axis(~ . * 0.1, name = "Muertes"))

4.3 Utilice la funcion scale_y_continuous para agregar un tÃtulo a
cada eje Y.
ggplot(deaths_clinic1, aes(x = date)) +
geom_line(aes(y = births, color = "Nacimientos")) +
geom_line(aes(y = deaths, color = "Muertes")) +
scale_y_continuous(name = "Nacimientos", sec.axis = sec_axis(~ . * 0.1, name = "Muertes"))

4.4 Agregue un tÃtulo al eje X y un tÃtulo general a toda la
gráfica.
ggplot(deaths_clinic1, aes(x = date)) +
geom_line(aes(y = births, color = "Nacimientos")) +
geom_line(aes(y = deaths, color = "Muertes")) +
scale_y_continuous(name = "Nacimientos", sec.axis = sec_axis(~ . * 0.1, name = "Muertes")) +
labs(title = "Nacimientos y muertes en la ClÃnica 1",
x = "Fecha")

4.5 Establezca color verde al comportamiento de la variable births y
naranja para deaths.
ggplot(deaths_clinic1, aes(x = date)) +
geom_line(aes(y = births, color = "Nacimientos")) +
geom_line(aes(y = deaths, color = "Muertes")) +
scale_y_continuous(name = "Nacimientos", sec.axis = sec_axis(~ . * 0.1, name = "Muertes")) +
labs(title = "Nacimientos y muertes en la ClÃnica 1",
x = "Fecha") +
scale_color_manual(values = c("Nacimientos" = "green", "Muertes" = "orange"))

4.6 Imprima la gráfica resultante.
ggplotly(ggplot(deaths_clinic1, aes(x = date)) +
geom_line(aes(y = births, color = "Nacimientos")) +
geom_line(aes(y = deaths, color = "Muertes")) +
scale_y_continuous(name = "Nacimientos", sec.axis = sec_axis(~ . * 0.1, name = "Muertes")) +
labs(title = "Nacimientos y muertes en la ClÃnica 1",
x = "Fecha") +
scale_color_manual(values = c("Nacimientos" = "green", "Muertes" = "orange"))
)
4.7 Construya una opinión con el resultado de la gráfica.
5 El efecto del lavado de manos. Analicemos la proporción de muertes
a lo largo del tiempo.
Perspectiva lineal ## 5.1 Agregue una nueva columna a la variable
creada en el inciso 4.1. Esta nueva columna se calculará como la
proporción de muertes por número de nacimientos. Guarde este cambio en
una nueva variable.
deaths_clinic1 <- deaths_clinic1 %>%
mutate(proportion_deaths = deaths / births)
5.2 Imprima las primeras filas del dataframe del punto anterior.
Haga uso de la función head()
head(deaths_clinic1)
5.3 Elabore una gráfica lineal utilizando la columna creada en el
incico 5.1 (eje y) versus la colunma date (eje x).
ggplot(deaths_clinic1, aes(x = date, y = proportion_deaths)) +
geom_line()

5.4 Utilice la funcion labs para dar al eje x y al eje y una
estética a las etiquetas.
ggplot(deaths_clinic1, aes(x = date, y = proportion_deaths)) +
geom_line() +
labs(title = "Proporción de muertes en la ClÃnica 1",
x = "Fecha",
y = "Proporción de muertes")

5.5 Por último, imprima la gráfica y concluya.
ggplotly(ggplot(deaths_clinic1, aes(x = date, y = proportion_deaths)) +
geom_line() +
labs(title = "Proporción de muertes en la ClÃnica 1",
x = "Fecha",
y = "Proporción de muertes")
)
Perspectiva de barras
5.8 Por último, imprima la grafica y concluya.
ggplotly(ggplot(deaths_clinic1_yearly, aes(x = year, y = mean_proportion_deaths)) +
geom_bar(stat = "identity") +
labs(title = "Proporción de muertes promedio en la ClÃnica 1",
x = "Año",
y = "Proporción de muertes promedio")
)
Los resultados del lavado de manos
A partir del año 1847 la proporción de muertes se reduce
drásticamente y, sÃ, fue entonces cuando se hizo obligatorio el lavado
de manos. El efecto del lavado de manos se hace aún más claro si lo
resaltamos en el gráfico.
6.1 Agregue una columna a la variable creada en el inciso 5.1, está
columna será TRUE a partir del año en que se impuso el lavado de manos y
FALSE para años anteriores. Guarde este cambio en una nueva
variable.
deaths_clinic1 <- deaths_clinic1 %>%
mutate(handwashing_started = date >= "1847-01-01")
6.2 Construya una gráfica lineal tomando de referencia la variable
con la proporción (muertes/nacimientos) para el eje y versus la variable
date para el eje x. Haga que el color de la linea dependa de la columna
creada en el inciso 6.1
ggplot(deaths_clinic1, aes(x = date, y = proportion_deaths, color = handwashing_started)) +
geom_line()

6.3 Utilice la función labs para dar al eje x y al eje y una
estética a las etiquetas.
ggplot(deaths_clinic1, aes(x = date, y = proportion_deaths, color = handwashing_started)) +
geom_line() +
labs(title = "Proporción de muertes en la ClÃnica 1",
x = "Fecha",
y = "Proporción de muertes")

6.4 Imprima la gráfica y concluya
ggplotly(ggplot(deaths_clinic1, aes(x = date, y = proportion_deaths, color = handwashing_started)) +
geom_line() +
labs(title = "Proporción de muertes en la ClÃnica 1",
x = "Fecha",
y = "Proporción de muertes"))
7 ¿Más lavado de manos, menos muertes?
Nuevamente, las estadÃsticas muestran que lavarse las manos tuvo un
efecto enorme. ¿Cuánto redujo la proporción mensual de muertes en
promedio?
7.1 Tome de referencia la columna que se agregó en el inciso 6.1 y
utilice la función groub_by para crear un agrupamiento.
deaths_clinic1$month <- month(deaths_clinic1$date)
monthly <- deaths_clinic1 %>%
group_by(handwashing_started, year(date), month(date)) %>%
summarise(mean_proportion_deaths = mean(proportion_deaths))
`summarise()` has grouped output by 'handwashing_started', 'year(date)'. You can override using the `.groups` argument.
7.2 En continuidad al inciso anterior, aplique summarise para
calcular el promedio de la proporción de muertes antes y después de que
se impusiera el lavado de manos. Tome de referencia la variable con la
proporción (muertes/nacimientos).
monthly_summary <- monthly %>%
group_by(handwashing_started) %>%
summarise(mean_proportion_deaths = mean(mean_proportion_deaths))
7.3 Asigne el resultado a una nueva variable e imprÃmala.
monthly_summary
7.4 Utlice ggplot para crear un boxplot que tome de referencia la
columna creada en el inciso 6.1 (eje x) versus la variable de proporción
(muertes/nacimientos).
ggplot(monthly, aes(x = handwashing_started, y = mean_proportion_deaths)) +
geom_boxplot()

7.5 Imprima la gráfica y concluya en función de los incisos 7.3 y
7.4.
ggplot(monthly, aes(x = handwashing_started, y = mean_proportion_deaths)) +
geom_boxplot()

8 Análisis estadÃstico de los datos de lavado de manos
¡Redujo la proporción de muertes en alrededor de 8 puntos
porcentuales! Del 10% en promedio antes del lavado de manos a solo el 2%
cuando se hizo cumplir el lavado de manos (que sigue siendo un número
alto según los estándares modernos). Para tener una idea de la
incertidumbre en torno a cuánto se reduce la mortalidad por lavarse las
manos, podrÃamos observar un intervalo de confianza (aquà calculado
mediante una prueba t).
Utilice la función t.test para calcular un intervalo de confianza del
95%. Los dos grupos que tenemos son proporción mensual de muertes antes
y después de que comenzara el lavado de manos. Tome de referencia la
columna con la proporción (muertes/nacimientos) y la columna creada en
el inciso 6.1.
t.test(monthly$mean_proportion_deaths ~ monthly$handwashing_started)
Welch Two Sample t-test
data: monthly$mean_proportion_deaths by monthly$handwashing_started
t = 6.7105, df = 84.198, p-value = 2.114e-09
alternative hypothesis: true difference in means between group FALSE and group TRUE is not equal to 0
95 percent confidence interval:
0.05290915 0.09747238
sample estimates:
mean in group FALSE mean in group TRUE
0.10691840 0.03172764
Interprete los datos resultantes y proporcione una conclusión.
9 Análisis estadÃstico propio
9.1 Aplique funciones como filter, count, select o visualizaciones
de tipo histograma o gráfica de puntos, que le permitan descubrir
comportamientos o tendencias en los datos. No se limite a estas
sugerencia, puede aplciar cualquier otro tipo de función.
ggplot(deaths_clinic1, aes(x = date, y = proportion_deaths, color = handwashing_started)) +
geom_line() +
labs(title = "Proporción de muertes en la ClÃnica 1",
x = "Fecha",
y = "Proporción de muertes")

9.2 Para cada análisis estadÃstico que proporcione concluya en
función de los resultados obtenidos.
ggplot(deaths_clinic1, aes(x = date, y = proportion_deaths, color = handwashing_started)) +
geom_line() +
labs(title = "Proporción de muertes en la ClÃnica 1",
x = "Fecha",
y = "Proporción de muertes")

LS0tCnRpdGxlOiAiUHJveWVjdG8iCm91dHB1dDogaHRtbF9ub3RlYm9vawpuYW1lOiBKdWFuIENhcmxvcyBTb2xsb3kgWGljw7NuCmNvdXJzZTogRnVuZGFtZW50b3MgZGUgcHJvZ3JhbWFjacOzbiB5IHNjcmlwdGluZwpkYXRlOiAwOC0wNy0yMDI0Ci0tLQojIERlc2NyaXBjacOzbgoKTGEgc2Vww6FpcyBvY2FzaW9uYSBlbiBlbCBtdW5kbyBtw6FzIGRlIG1pbCBtdWVydGVzIGNhZGEgZMOtYSwgbXVjaG9zIGRlIGVzdG9zIHBhY2llbnRlcyBhZHF1aWVyZW4gbGEgaW5mZWNjacOzbiBlc3RhbmRvIGhvc3BpdGFsaXphZG9zIHkgY29uc3RpdHV5ZSBsYSBjb21wbGljYWNpw7NuIGludHJhaG9zcGl0YWxhcmlhIG3DoXMgZnJlY3VlbnRlLiBMYSBpbmZlY2Npw7NuIGRlIHBhY2llbnRlcyBwb3IgbGFzIG1hbm9zIGRlIGNvbnRhbWluYWRhcyBkZWwgcGVyc29uYWwgZGUgc2FsdWQgZXMgdW5hIGRlIGxhcyBmb3JtYXMgZGUgZGlzZW1pbmFjacOzbiBkZSBsb3MgYWdlbnRlcyBpbmZlY2Npb3Nvcy4gTGEgaGlnaWVuZSBkZSBsYXMgbWFub3MgZXMgZWwgZmFjdG9yIGluZGl2aWR1YWwgbcOhcyBpbXBvcnRhbnRlIHBhcmEgZWwgY29udHJvbCBkZSBsYXMgaW5mZWNjaW9uZXMsIGVzIGRpZsOtY2lsIGVudGVuZGVyIHF1ZSB1biBoZWNobyB0YW4gcnV0aW5hcmlvIGVuIGxhIHByw6FjdGljYSBkZSBsYSBtZWRpY2luYSwgY29tbyBsYXZhcnNlIGxhcyBtYW5vcyBwcmV2aW8gYSBleGFtaW5hciBhIHVuIHBhY2llbnRlLCBoYXlhIGNhdXNhZG8gdGFudGEgY29udHJvdmVyc2lhIGVuIGxhIMOpcG9jYSBkZSAxODAwLgoKQSBwcmluY2lwaW9zIGRlIGxhIGTDqWNhZGEgZGUgMTg0MCBzZSBkZXNjdWJyacOzIHVuYSBlbmZlcm1lZGFkIG1vcnRhbCBxdWUgYWZlY3RhYmEgYSBsYXMgbXVqZXJlcyBxdWUgYWNhYmFiYW4gZGUgZGFyIGEgbHV6LCBjZXJjYSBkZWwgMTAlIGRlIGxhcyBtdWplcmVzIG1vcsOtYW4gYSBjYXVzYSBkZSBlc3RhIGVuZmVybWVkYWQgeSBlbCBvcmlnZW4gcHJvdmVuw61hIGRlIGxhcyBtYW5vcyBjb250YW1pbmFkYXMgZGVsIHBlcnNvbmFsIG3DqWRpY28gcXVlIGF0ZW5kw61hIGxvcyBwYXJ0b3MuCgpFbiBlc3RlIHByb3llY3RvLCB2YW1vcyBhbmFsaXphciBsb3MgZGF0b3MgcXVlIGRlbXVlc3RyYW4gbGEgaW1wb3J0YW5jaWEgZGVsIGxhdmFkbyBkZSBtYW5vcywgaWRlbnRpZmljYW5kbyBhbm9tYWzDrWFzIGVuIGxvcyBwcm9jZWRpbWllbnRvcyBtw6lkaWNvcy4KCiMgMS4gQ29ub2NpZW5kbyBsb3MgZGF0b3MKCiMjIDEuMSBDYXJndWUgZWwgcGFxdWV0ZSB0aWR5dmVyc2UKYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQppbnN0YWxsLnBhY2thZ2VzKCJwbG90bHkiKQpsaWJyYXJ5KHBsb3RseSkKYGBgCgojIyAxLjIgTGVhIGVsIGFyY2hpdm8gZGVhdGhfaGFuZHdhc2hpbmcuY3N2IHVzYW5kbyByZWFkX2NzdiB5IGFzw61nbmVsbyBhIHVuYSB2YXJpYWJsZS4KYGBge3J9CmRlYXRoc19oYW5kd2FzaGluZyA8LSByZWFkX2NzdigiZGVhdGhzX2hhbmR3YXNoaW5nLmNzdiIpCmBgYAojIyAxLjMgSW1wcmltYSBsYSB2YXJpYWJsZSBkZWwgaW5jaXNvIDEuMgpgYGB7cn0KZGVhdGhzX2hhbmR3YXNoaW5nCmBgYAojIDIgRWwgYWxhcm1hbnRlIG7Dum1lcm8gZGUgbXVlcnRlcwoKTGEgdGFibGEgYW50ZXJpb3IgbXVlc3RyYSBlbCBuw7ptZXJvIGRlIG11amVyZXMgcXVlIGRpZXJvbiBhIGx1eiBkdXJhbnRlIGxvcyBhw7FvcyAxODQxIGEgMTg0NiBlbiB1bmEgY2l1ZGFkIGFsIG5vcmVzdGUgZGUgQXVzdHJpYSwgZW4gZG9zIGNsw61uaWNhcyBlbiBwYXJ0aWN1bGFyLiBOb3RhcsOhIHF1ZSBkYXIgYSBsdXogZXJhIG11eSBwZWxpZ3Jvc287IHVuIG7Dum1lcm8gYWxhcm1hbnRlIGRlIG11amVyZXMgbXVyacOzIGNvbW8gcmVzdWx0YWRvIGRlbCBwYXJ0by4gVmVtb3MgZXN0byBjb24gbWF5b3IgY2xhcmlkYWQgc2kgb2JzZXJ2YW1vcyBsYSBwcm9wb3JjacOzbiBkZSBtdWVydGVzIGNvbiByZXNwZWN0byBhbCBuw7ptZXJvIGRlIG11amVyZXMgcXVlIGRpZXJvbiBhIGx1ei4KCiMjIDIuMSBVc2UgbXV0YXRlIHBhcmEgYWdyZWdhciB1bmEgbnVldmEgY29sdW1uYSBxdWUgc2UgY2FsY3VsYXLDoSBjb21vIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgcG9yIG7Dum1lcm8gZGUgbmFjaW1pZW50b3MuCmBgYHtyfQpkZWF0aHNfaGFuZHdhc2hpbmcgPC0gZGVhdGhzX2hhbmR3YXNoaW5nICU+JQogIG11dGF0ZShwcm9wb3J0aW9uX2RlYXRocyA9IGRlYXRocyAvIGJpcnRocykKYGBgCgojIyAyLjIgSW1wcmltYSBlbCBkYXRhc2V0IGNvbiBsYW51ZXZhIHZhcmlhYmxlLgpgYGB7cn0KZGVhdGhzX2hhbmR3YXNoaW5nICU+JQogIGFycmFuZ2UoZGVzYyhwcm9wb3J0aW9uX2RlYXRocykpCmBgYAojIDMgTXVlcnRlIGVuIGxhcyBjbMOtbmljYXMgClNpIGFob3JhIGdyYWZpY2Ftb3MgbGEgcHJvcG9yY2nDs24gZGUgbXVlcnRlcyBlbiBsYSBjbMOtbmljYSAxIGNvbW8gZW4gbGEgY2zDrW5pY2EgMiwgdmVyZW1vcyB1biBwYXRyw7NuIGN1cmlvc28uCgojIyAzLjEgVXRpbGljZSBnZ3Bsb3QgcGFyYSBoYWNlciB1bmEgZ3LDoWZpY2EgbGluZWFsLiBUb21lIGRlIHJlZmVyZW5jaWEgbGEgY29sdW1uYSBjcmVhZGEgZW4gZWwgaW5jaXNvIDIuMSAoZWplKSB2ZXJzdXMgbGEgdmFyaWFibGUgeWVhciAoZWplIHgpLgpgYGB7cn0KZ2dwbG90KGRlYXRoc19oYW5kd2FzaGluZywgYWVzKHggPSB5ZWFyLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMpKSArCiAgZ2VvbV9saW5lKCkKYGBgCiMjIDMuMiBVdGlsaWNlIGxhIHZhcmlhYmxlIGNsaW5pYyBwYXJhIGRlZmluaXIgdW4gY29sb3IgZGlzdGludG8gZW4gbGEgZXN0w6l0aWNhIGRlIGxhIGdyw6FmaWNhLgpgYGB7cn0KZ2dwbG90KGRlYXRoc19oYW5kd2FzaGluZywgYWVzKHggPSB5ZWFyLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMsIGNvbG9yID0gY2xpbmljKSkgKwogIGdlb21fbGluZSgpCmBgYAojIyAzLjMgUG9yIMO6bHRpbW8sIGltcHJpbWEgbGEgZ3LDoWZpY2EgeSBleHBvbmdhIHN1IHB1bnRvIGRlIHZpc3RhLgpgYGB7cn0KZ2dwbG90bHkoZ2dwbG90KGRlYXRoc19oYW5kd2FzaGluZywgYWVzKHggPSB5ZWFyLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMsIGNvbG9yID0gY2xpbmljKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZW4gbGFzIGNsw61uaWNhcyAxIHkgMiIsCiAgICAgICB4ID0gIkHDsW8iLAogICAgICAgeSA9ICJQcm9wb3JjacOzbiBkZSBtdWVydGVzIikKICAgICkKYGBgCgojIyBPYnNlcnZhY2lvbmVzCkxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZW4gbGEgQ2zDrW5pY2EgMSBlcyBtdWNobyBtw6FzIGFsdGEgcXVlIGVuIGxhIENsw61uaWNhIDIuIApBIHBhcnRpciBkZWwgYcOxbyAxODQyIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZW4gYW1iYXMgY2zDrW5pY2FzIGVtcGV6w7MgYSBkaXNtaW51aXIgZGUgbWFuZXJhIHNpZ25pZmljYXRpdmEuCkVuIGVsIGHDsW8gMTg0NSBsYSBwcm9wb3JjacOzbiBkZSBtdWVydGVzIHR1dm8gdW4gYXVtZW50byBlbiBhbWJhcyBjbMOtbmljYXMuCgojIDQgQ29taWVuemEgZWwgbGF2YWRvIGRlIG1hbm9zCgrCv1BvciBxdcOpIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZXMgbXVjaG8gbcOhcyBhbHRhIGVuIGxhIENsw61uaWNhIDE/IApMYSDDum5pY2EgZGlmZXJlbmNpYSBlbiBhbWJhcyBjbMOtbmljYXMgZXJhIHF1ZSBtdWNob3MgZXN0dWRpYW50ZXMgZGUgbWVkaWNpbmEgdHJhYmFqYWJhbiBlbiBsYSBDbMOtbmljYSAxLCBtaWVudHJhcyBxdWUgZW4gbGEgQ2zDrW5pY2EgMiBubyBoYWLDrWEgdGFudG9zLiAKT3RybyBkYXRvIGludGVyZXNhbnRlIGVzIHF1ZSBsb3MgbcOpZGljb3MgcXVlIGF0ZW5kw61hbiBwYXJ0b3Mgc29sbyBzZSBlbmNhcmdhYmFuIGRlIGVzYSBmdW5jacOzbiwgbWllbnRyYXMgcXVlIGxvcyBlc3R1ZGlhbnRlcyB0YW1iacOpbiBwYXNhYmFuIHRpZW1wbyBlbiBsYXMgc2FsYXMgZGUgYXV0b3BzaWFzIGV4YW1pbmFuZG8gY2Fkw6F2ZXJlcy4KClNlIGVtcGV6w7MgYSBzb3NwZWNoYXIgcXVlIGFsZ28gZW4gbG9zIGNhZMOhdmVyZXMsIHByb3BhZ2FkbyBkZSBsYXMgbWFub3MgZGUgbG9zIGVzdHVkaWFudGVzIGRlIG1lZGljaW5hLCBjYXVzYWJhIGxhIGVuZmVybWVkYWQuIApFbnRvbmNlcywgZW4gdW4gaW50ZW50byBkZXNlc3BlcmFkbyBwb3IgZGV0ZW5lciBsYXMgYWx0YXMgdGFzYXMgZGUgbW9ydGFsaWRhZCwgc2UgZGVjcmV0w7M6IMKhTMOhdmVzZSBsYXMgbWFub3MgZW4gdG9kbyBtb21lbnRvIQoKIyMgNC4xIENhcmd1ZSBsb3MgZGF0b3MgbWVuc3VhbGVzIGRlIGxhIENsw61uaWNhIDEgcGFyYSB2ZXIgc2kgZWwgbGF2YWRvIGRlIG1hbm9zIHR1dm8gYWxnw7puIGVmZWN0bywgcGFyYSBlc3RvIGxlYSBlbCBhcmNoaXZvIGRlYXRoc19jbGluaWMxLmNzdiB5IGFzw61nbmVsbyBhIHVuYSBudWV2YSB2YXJpYWJsZS4KYGBge3J9CmRlYXRoc19jbGluaWMxIDwtIHJlYWRfY3N2KCJkZWF0aHNfY2xpbmljXzEuY3N2IikKYGBgCgojIyA0LjIgVXRpbGljZSBnZ3Bsb3QgcGFyYSBoYWNlciB1bmEgZ3LDoWZpY2EgbGluZWFsLiAKTGEgZ3LDoWZpY2EgdGVuZHLDoSBsYSBjYXJhY3RlcsOtc3RpY2EgZGUgc2VyIGR1YWwgKGRvcyBlamVzIFkpLiAKUGFyYSBlbCBlamUgWCBzZSB1dGlsaXphcsOhIGxhIHZhcmlhYmxlIGRhdGUgeSBwYXJhIFkxIHkgWTIsIHNlcsOhbiBiaXJ0aHMgeSBkZWF0aHMgcmVzcGVjdGl2YW1lbnRlLgpgYGB7cn0KZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gYmlydGhzLCBjb2xvciA9ICJOYWNpbWllbnRvcyIpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gZGVhdGhzLCBjb2xvciA9ICJNdWVydGVzIikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMoc2VjLmF4aXMgPSBzZWNfYXhpcyh+IC4gKiAwLjEsIG5hbWUgPSAiTXVlcnRlcyIpKQpgYGAKIyMgNC4zIFV0aWxpY2UgbGEgZnVuY2lvbiBzY2FsZV95X2NvbnRpbnVvdXMgcGFyYSBhZ3JlZ2FyIHVuIHTDrXR1bG8gYSBjYWRhIGVqZSBZLgpgYGB7cn0KZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gYmlydGhzLCBjb2xvciA9ICJOYWNpbWllbnRvcyIpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gZGVhdGhzLCBjb2xvciA9ICJNdWVydGVzIikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOYWNpbWllbnRvcyIsIHNlYy5heGlzID0gc2VjX2F4aXMofiAuICogMC4xLCBuYW1lID0gIk11ZXJ0ZXMiKSkKYGBgCiMjIDQuNCBBZ3JlZ3VlIHVuIHTDrXR1bG8gYWwgZWplIFggeSB1biB0w610dWxvIGdlbmVyYWwgYSB0b2RhIGxhIGdyw6FmaWNhLgpgYGB7cn0KZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gYmlydGhzLCBjb2xvciA9ICJOYWNpbWllbnRvcyIpKSArCiAgZ2VvbV9saW5lKGFlcyh5ID0gZGVhdGhzLCBjb2xvciA9ICJNdWVydGVzIikpICsKICBzY2FsZV95X2NvbnRpbnVvdXMobmFtZSA9ICJOYWNpbWllbnRvcyIsIHNlYy5heGlzID0gc2VjX2F4aXMofiAuICogMC4xLCBuYW1lID0gIk11ZXJ0ZXMiKSkgKwogIGxhYnModGl0bGUgPSAiTmFjaW1pZW50b3MgeSBtdWVydGVzIGVuIGxhIENsw61uaWNhIDEiLAogICAgICAgeCA9ICJGZWNoYSIpCmBgYAojIyA0LjUgRXN0YWJsZXpjYSBjb2xvciB2ZXJkZSBhbCBjb21wb3J0YW1pZW50byBkZSBsYSB2YXJpYWJsZSBiaXJ0aHMgeSBuYXJhbmphIHBhcmEgZGVhdGhzLiAKYGBge3J9CmdncGxvdChkZWF0aHNfY2xpbmljMSwgYWVzKHggPSBkYXRlKSkgKwogIGdlb21fbGluZShhZXMoeSA9IGJpcnRocywgY29sb3IgPSAiTmFjaW1pZW50b3MiKSkgKwogIGdlb21fbGluZShhZXMoeSA9IGRlYXRocywgY29sb3IgPSAiTXVlcnRlcyIpKSArCiAgc2NhbGVfeV9jb250aW51b3VzKG5hbWUgPSAiTmFjaW1pZW50b3MiLCBzZWMuYXhpcyA9IHNlY19heGlzKH4gLiAqIDAuMSwgbmFtZSA9ICJNdWVydGVzIikpICsKICBsYWJzKHRpdGxlID0gIk5hY2ltaWVudG9zIHkgbXVlcnRlcyBlbiBsYSBDbMOtbmljYSAxIiwKICAgICAgIHggPSAiRmVjaGEiKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcyA9IGMoIk5hY2ltaWVudG9zIiA9ICJncmVlbiIsICJNdWVydGVzIiA9ICJvcmFuZ2UiKSkKYGBgCiMjIDQuNiBJbXByaW1hIGxhIGdyw6FmaWNhIHJlc3VsdGFudGUuCmBgYHtyfQpnZ3Bsb3RseShnZ3Bsb3QoZGVhdGhzX2NsaW5pYzEsIGFlcyh4ID0gZGF0ZSkpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBiaXJ0aHMsIGNvbG9yID0gIk5hY2ltaWVudG9zIikpICsKICBnZW9tX2xpbmUoYWVzKHkgPSBkZWF0aHMsIGNvbG9yID0gIk11ZXJ0ZXMiKSkgKwogIHNjYWxlX3lfY29udGludW91cyhuYW1lID0gIk5hY2ltaWVudG9zIiwgc2VjLmF4aXMgPSBzZWNfYXhpcyh+IC4gKiAwLjEsIG5hbWUgPSAiTXVlcnRlcyIpKSArCiAgbGFicyh0aXRsZSA9ICJOYWNpbWllbnRvcyB5IG11ZXJ0ZXMgZW4gbGEgQ2zDrW5pY2EgMSIsCiAgICAgICB4ID0gIkZlY2hhIikgKwogIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBjKCJOYWNpbWllbnRvcyIgPSAiZ3JlZW4iLCAiTXVlcnRlcyIgPSAib3JhbmdlIikpCikKYGBgCgojIyA0LjcgQ29uc3RydXlhIHVuYSBvcGluacOzbiBjb24gZWwgcmVzdWx0YWRvIGRlIGxhIGdyw6FmaWNhLgoKIyA1IEVsIGVmZWN0byBkZWwgbGF2YWRvIGRlIG1hbm9zLiBBbmFsaWNlbW9zIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgYSBsbyBsYXJnbyBkZWwgdGllbXBvLgoKUGVyc3BlY3RpdmEgbGluZWFsCiMjIDUuMSBBZ3JlZ3VlIHVuYSBudWV2YSBjb2x1bW5hIGEgbGEgdmFyaWFibGUgY3JlYWRhIGVuIGVsIGluY2lzbyA0LjEuIApFc3RhIG51ZXZhIGNvbHVtbmEgc2UgY2FsY3VsYXLDoSBjb21vIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgcG9yIG7Dum1lcm8gZGUgbmFjaW1pZW50b3MuIEd1YXJkZSBlc3RlIGNhbWJpbyBlbiB1bmEgbnVldmEgdmFyaWFibGUuCmBgYHtyfQpkZWF0aHNfY2xpbmljMSA8LSBkZWF0aHNfY2xpbmljMSAlPiUKICBtdXRhdGUocHJvcG9ydGlvbl9kZWF0aHMgPSBkZWF0aHMgLyBiaXJ0aHMpCmBgYAoKCiMjIDUuMiBJbXByaW1hIGxhcyBwcmltZXJhcyBmaWxhcyBkZWwgZGF0YWZyYW1lIGRlbCBwdW50byBhbnRlcmlvci4gSGFnYSB1c28gZGUgbGEgZnVuY2nDs24gaGVhZCgpCmBgYHtyfQpoZWFkKGRlYXRoc19jbGluaWMxKQpgYGAKCiMjIDUuMyBFbGFib3JlIHVuYSBncsOhZmljYSBsaW5lYWwgdXRpbGl6YW5kbyBsYSBjb2x1bW5hIGNyZWFkYSBlbiBlbCBpbmNpY28gNS4xIChlamUgeSkgdmVyc3VzIGxhIGNvbHVubWEgZGF0ZSAoZWplIHgpLgoKYGBge3J9CmdncGxvdChkZWF0aHNfY2xpbmljMSwgYWVzKHggPSBkYXRlLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMpKSArCiAgZ2VvbV9saW5lKCkKYGBgCgojIyA1LjQgVXRpbGljZSBsYSBmdW5jaW9uIGxhYnMgcGFyYSBkYXIgYWwgZWplIHggeSBhbCBlamUgeSB1bmEgZXN0w6l0aWNhIGEgbGFzIGV0aXF1ZXRhcy4KYGBge3J9CmdncGxvdChkZWF0aHNfY2xpbmljMSwgYWVzKHggPSBkYXRlLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiUHJvcG9yY2nDs24gZGUgbXVlcnRlcyBlbiBsYSBDbMOtbmljYSAxIiwKICAgICAgIHggPSAiRmVjaGEiLAogICAgICAgeSA9ICJQcm9wb3JjacOzbiBkZSBtdWVydGVzIikKYGBgCiMjIDUuNSBQb3Igw7psdGltbywgaW1wcmltYSBsYSBncsOhZmljYSB5IGNvbmNsdXlhLgpgYGB7cn0KZ2dwbG90bHkoZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUsIHkgPSBwcm9wb3J0aW9uX2RlYXRocykpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJQcm9wb3JjacOzbiBkZSBtdWVydGVzIGVuIGxhIENsw61uaWNhIDEiLAogICAgICAgeCA9ICJGZWNoYSIsCiAgICAgICB5ID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMiKQopCmBgYApQZXJzcGVjdGl2YSBkZSBiYXJyYXMKCiMjIDUuNiBVc2UgZ3JvdXBfYnkgcGFyYSBsYSB2YXJpYWJsZSB5ZWFyIHkgc3VtbWFyaXNlIHBhcmEgZW5jb250cmFyIGxhIG1lZGlhIHRvbWFuZG8gZGUgcmVmZXJlbmNpYSBsYSB2YXJpYWJsZSBkZWwgaW5jaXNvIDUuMS4gR3VhcmRlIGVsIHJlc3VsdGFkbyBlbiB1bmEgbnVldmEgdmFyaWFibGUuCgpgYGB7cn0KZGVhdGhzX2NsaW5pYzEkeWVhciA8LSB5ZWFyKGRlYXRoc19jbGluaWMxJGRhdGUpCmRlYXRoc19jbGluaWMxX3llYXJseSA8LSBkZWF0aHNfY2xpbmljMSAlPiUKICBncm91cF9ieSh5ZWFyKSAlPiUKICBzdW1tYXJpc2UobWVhbl9wcm9wb3J0aW9uX2RlYXRocyA9IG1lYW4ocHJvcG9ydGlvbl9kZWF0aHMpKQpgYGAKCiMjIDUuNyBVdGlsaWNlIGxhIHZhcmlhYmxlIGNyZWFkYSBlbiBlbCBpbmNpc28gYW50ZXJpb3IgcGFyYSBjcmVhciB1biBncsOhZmljbyBkZSBiYXJyYXMgcXVlIG11ZXN0cmUgbGEgbWVkaWEgZW4gY2FkYSBhw7FvLgoKYGBge3J9CmdncGxvdChkZWF0aHNfY2xpbmljMV95ZWFybHksIGFlcyh4ID0geWVhciwgeSA9IG1lYW5fcHJvcG9ydGlvbl9kZWF0aHMpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpCmBgYAoKIyMgNS44IFBvciDDumx0aW1vLCBpbXByaW1hIGxhIGdyYWZpY2EgeSBjb25jbHV5YS4KYGBge3J9CmdncGxvdGx5KGdncGxvdChkZWF0aHNfY2xpbmljMV95ZWFybHksIGFlcyh4ID0geWVhciwgeSA9IG1lYW5fcHJvcG9ydGlvbl9kZWF0aHMpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsKICBsYWJzKHRpdGxlID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgcHJvbWVkaW8gZW4gbGEgQ2zDrW5pY2EgMSIsCiAgICAgICB4ID0gIkHDsW8iLAogICAgICAgeSA9ICJQcm9wb3JjacOzbiBkZSBtdWVydGVzIHByb21lZGlvIikKKQpgYGAKIyBMb3MgcmVzdWx0YWRvcyBkZWwgbGF2YWRvIGRlIG1hbm9zCgpBIHBhcnRpciBkZWwgYcOxbyAxODQ3IGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgc2UgcmVkdWNlIGRyw6FzdGljYW1lbnRlIHksIHPDrSwgZnVlIGVudG9uY2VzIGN1YW5kbyBzZSBoaXpvIG9ibGlnYXRvcmlvIGVsIGxhdmFkbyBkZSBtYW5vcy4KRWwgZWZlY3RvIGRlbCBsYXZhZG8gZGUgbWFub3Mgc2UgaGFjZSBhw7puIG3DoXMgY2xhcm8gc2kgbG8gcmVzYWx0YW1vcyBlbiBlbCBncsOhZmljby4KCiMgNi4xIEFncmVndWUgdW5hIGNvbHVtbmEgYSBsYSB2YXJpYWJsZSBjcmVhZGEgZW4gZWwgaW5jaXNvIDUuMSwgZXN0w6EgY29sdW1uYSBzZXLDoSBUUlVFIGEgcGFydGlyIGRlbCBhw7FvIGVuIHF1ZSBzZSBpbXB1c28gZWwgbGF2YWRvIGRlIG1hbm9zIHkgRkFMU0UgcGFyYSBhw7FvcyBhbnRlcmlvcmVzLiBHdWFyZGUgZXN0ZSBjYW1iaW8gZW4gdW5hIG51ZXZhIHZhcmlhYmxlLgpgYGB7cn0KZGVhdGhzX2NsaW5pYzEgPC0gZGVhdGhzX2NsaW5pYzEgJT4lCiAgbXV0YXRlKGhhbmR3YXNoaW5nX3N0YXJ0ZWQgPSBkYXRlID49ICIxODQ3LTAxLTAxIikKYGBgCgojIyA2LjIgQ29uc3RydXlhIHVuYSBncsOhZmljYSBsaW5lYWwgdG9tYW5kbyBkZSByZWZlcmVuY2lhIGxhIHZhcmlhYmxlIGNvbiBsYSBwcm9wb3JjacOzbiAobXVlcnRlcy9uYWNpbWllbnRvcykgcGFyYSBlbCBlamUgeSB2ZXJzdXMgbGEgdmFyaWFibGUgZGF0ZSBwYXJhIGVsIGVqZSB4LiBIYWdhIHF1ZSBlbCBjb2xvciBkZSBsYSBsaW5lYSBkZXBlbmRhIGRlIGxhIGNvbHVtbmEgY3JlYWRhIGVuIGVsIGluY2lzbyA2LjEKYGBge3J9CmdncGxvdChkZWF0aHNfY2xpbmljMSwgYWVzKHggPSBkYXRlLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMsIGNvbG9yID0gaGFuZHdhc2hpbmdfc3RhcnRlZCkpICsKICBnZW9tX2xpbmUoKQpgYGAKIyMgNi4zIFV0aWxpY2UgbGEgZnVuY2nDs24gbGFicyBwYXJhIGRhciBhbCBlamUgeCB5IGFsIGVqZSB5IHVuYSBlc3TDqXRpY2EgYSBsYXMgZXRpcXVldGFzLgpgYGB7cn0KZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUsIHkgPSBwcm9wb3J0aW9uX2RlYXRocywgY29sb3IgPSBoYW5kd2FzaGluZ19zdGFydGVkKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZW4gbGEgQ2zDrW5pY2EgMSIsCiAgICAgICB4ID0gIkZlY2hhIiwKICAgICAgIHkgPSAiUHJvcG9yY2nDs24gZGUgbXVlcnRlcyIpCmBgYAojIyA2LjQgSW1wcmltYSBsYSBncsOhZmljYSB5IGNvbmNsdXlhCmBgYHtyfQpnZ3Bsb3RseShnZ3Bsb3QoZGVhdGhzX2NsaW5pYzEsIGFlcyh4ID0gZGF0ZSwgeSA9IHByb3BvcnRpb25fZGVhdGhzLCBjb2xvciA9IGhhbmR3YXNoaW5nX3N0YXJ0ZWQpKSArCiAgZ2VvbV9saW5lKCkgKwogIGxhYnModGl0bGUgPSAiUHJvcG9yY2nDs24gZGUgbXVlcnRlcyBlbiBsYSBDbMOtbmljYSAxIiwKICAgICAgIHggPSAiRmVjaGEiLAogICAgICAgeSA9ICJQcm9wb3JjacOzbiBkZSBtdWVydGVzIikpCmBgYAojIDcgwr9Nw6FzIGxhdmFkbyBkZSBtYW5vcywgbWVub3MgbXVlcnRlcz8KCk51ZXZhbWVudGUsIGxhcyBlc3RhZMOtc3RpY2FzIG11ZXN0cmFuIHF1ZSBsYXZhcnNlIGxhcyBtYW5vcyB0dXZvIHVuIGVmZWN0byBlbm9ybWUuIMK/Q3XDoW50byByZWR1am8gbGEgcHJvcG9yY2nDs24gbWVuc3VhbCBkZSBtdWVydGVzIGVuIHByb21lZGlvPwoKIyMgNy4xIFRvbWUgZGUgcmVmZXJlbmNpYSBsYSBjb2x1bW5hIHF1ZSBzZSBhZ3JlZ8OzIGVuIGVsIGluY2lzbyA2LjEgeSB1dGlsaWNlIGxhIGZ1bmNpw7NuIGdyb3ViX2J5IHBhcmEgY3JlYXIgdW4gYWdydXBhbWllbnRvLgoKYGBge3J9CmRlYXRoc19jbGluaWMxJG1vbnRoIDwtIG1vbnRoKGRlYXRoc19jbGluaWMxJGRhdGUpCm1vbnRobHkgPC0gZGVhdGhzX2NsaW5pYzEgJT4lCiAgZ3JvdXBfYnkoaGFuZHdhc2hpbmdfc3RhcnRlZCwgeWVhcihkYXRlKSwgbW9udGgoZGF0ZSkpICU+JQogIHN1bW1hcmlzZShtZWFuX3Byb3BvcnRpb25fZGVhdGhzID0gbWVhbihwcm9wb3J0aW9uX2RlYXRocykpCmBgYAojIyA3LjIgRW4gY29udGludWlkYWQgYWwgaW5jaXNvIGFudGVyaW9yLCBhcGxpcXVlIHN1bW1hcmlzZSBwYXJhIGNhbGN1bGFyIGVsIHByb21lZGlvIGRlIGxhIHByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgYW50ZXMgeSBkZXNwdcOpcyBkZSBxdWUgc2UgaW1wdXNpZXJhIGVsIGxhdmFkbyBkZSBtYW5vcy4gVG9tZSBkZSByZWZlcmVuY2lhIGxhIHZhcmlhYmxlIGNvbiBsYSBwcm9wb3JjacOzbiAobXVlcnRlcy9uYWNpbWllbnRvcykuCmBgYHtyfQptb250aGx5X3N1bW1hcnkgPC0gbW9udGhseSAlPiUKICBncm91cF9ieShoYW5kd2FzaGluZ19zdGFydGVkKSAlPiUKICBzdW1tYXJpc2UobWVhbl9wcm9wb3J0aW9uX2RlYXRocyA9IG1lYW4obWVhbl9wcm9wb3J0aW9uX2RlYXRocykpCmBgYAoKIyMgNy4zIEFzaWduZSBlbCByZXN1bHRhZG8gYSB1bmEgbnVldmEgdmFyaWFibGUgZSBpbXByw61tYWxhLiAKCmBgYHtyfQptb250aGx5X3N1bW1hcnkKYGBgCiMjIDcuNCBVdGxpY2UgZ2dwbG90IHBhcmEgY3JlYXIgdW4gYm94cGxvdCBxdWUgdG9tZSBkZSByZWZlcmVuY2lhIGxhIGNvbHVtbmEgY3JlYWRhIGVuIGVsIGluY2lzbyA2LjEgKGVqZSB4KSB2ZXJzdXMgbGEgdmFyaWFibGUgZGUgcHJvcG9yY2nDs24gKG11ZXJ0ZXMvbmFjaW1pZW50b3MpLgpgYGB7cn0KZ2dwbG90KG1vbnRobHksIGFlcyh4ID0gaGFuZHdhc2hpbmdfc3RhcnRlZCwgeSA9IG1lYW5fcHJvcG9ydGlvbl9kZWF0aHMpKSArCiAgZ2VvbV9ib3hwbG90KCkKYGBgCgojIyA3LjUgSW1wcmltYSBsYSBncsOhZmljYSB5IGNvbmNsdXlhIGVuIGZ1bmNpw7NuIGRlIGxvcyBpbmNpc29zIDcuMyB5IDcuNC4KYGBge3J9CmdncGxvdChtb250aGx5LCBhZXMoeCA9IGhhbmR3YXNoaW5nX3N0YXJ0ZWQsIHkgPSBtZWFuX3Byb3BvcnRpb25fZGVhdGhzKSkgKwogIGdlb21fYm94cGxvdCgpCmBgYAojIDggQW7DoWxpc2lzIGVzdGFkw61zdGljbyBkZSBsb3MgZGF0b3MgZGUgbGF2YWRvIGRlIG1hbm9zCgoKwqFSZWR1am8gbGEgcHJvcG9yY2nDs24gZGUgbXVlcnRlcyBlbiBhbHJlZGVkb3IgZGUgOCBwdW50b3MgcG9yY2VudHVhbGVzISBEZWwgMTAlIGVuIHByb21lZGlvIGFudGVzIGRlbCBsYXZhZG8gZGUgbWFub3MgYSBzb2xvIGVsIDIlIGN1YW5kbyBzZSBoaXpvIGN1bXBsaXIgZWwgbGF2YWRvIGRlIG1hbm9zIChxdWUgc2lndWUgc2llbmRvIHVuIG7Dum1lcm8gYWx0byBzZWfDum4gbG9zIGVzdMOhbmRhcmVzIG1vZGVybm9zKS4gUGFyYSB0ZW5lciB1bmEgaWRlYSBkZSBsYSBpbmNlcnRpZHVtYnJlIGVuIHRvcm5vIGEgY3XDoW50byBzZSByZWR1Y2UgbGEgbW9ydGFsaWRhZCBwb3IgbGF2YXJzZSBsYXMgbWFub3MsIHBvZHLDrWFtb3Mgb2JzZXJ2YXIgdW4gaW50ZXJ2YWxvIGRlIGNvbmZpYW56YSAoYXF1w60gY2FsY3VsYWRvIG1lZGlhbnRlIHVuYSBwcnVlYmEgdCkuCgpVdGlsaWNlIGxhIGZ1bmNpw7NuIHQudGVzdCBwYXJhIGNhbGN1bGFyIHVuIGludGVydmFsbyBkZSBjb25maWFuemEgZGVsIDk1JS4gTG9zIGRvcyBncnVwb3MgcXVlIHRlbmVtb3Mgc29uIHByb3BvcmNpw7NuIG1lbnN1YWwgZGUgbXVlcnRlcyBhbnRlcyB5IGRlc3B1w6lzIGRlIHF1ZSBjb21lbnphcmEgZWwgbGF2YWRvIGRlIG1hbm9zLiBUb21lIGRlIHJlZmVyZW5jaWEgbGEgY29sdW1uYSBjb24gbGEgcHJvcG9yY2nDs24gKG11ZXJ0ZXMvbmFjaW1pZW50b3MpIHkgbGEgY29sdW1uYSBjcmVhZGEgZW4gZWwgaW5jaXNvIDYuMS4KYGBge3J9CnQudGVzdChtb250aGx5JG1lYW5fcHJvcG9ydGlvbl9kZWF0aHMgfiBtb250aGx5JGhhbmR3YXNoaW5nX3N0YXJ0ZWQpCmBgYApJbnRlcnByZXRlIGxvcyBkYXRvcyByZXN1bHRhbnRlcyB5IHByb3BvcmNpb25lIHVuYSBjb25jbHVzacOzbi4KCiMgOSBBbsOhbGlzaXMgZXN0YWTDrXN0aWNvIHByb3BpbwoKIyMgOS4xIEFwbGlxdWUgZnVuY2lvbmVzIGNvbW8gZmlsdGVyLCBjb3VudCwgc2VsZWN0IG8gdmlzdWFsaXphY2lvbmVzIGRlIHRpcG8gaGlzdG9ncmFtYSBvIGdyw6FmaWNhIGRlIHB1bnRvcywgcXVlIGxlIHBlcm1pdGFuIGRlc2N1YnJpciBjb21wb3J0YW1pZW50b3MgbyB0ZW5kZW5jaWFzIGVuIGxvcyBkYXRvcy4gTm8gc2UgbGltaXRlIGEgZXN0YXMgc3VnZXJlbmNpYSwgcHVlZGUgYXBsY2lhciBjdWFscXVpZXIgb3RybyB0aXBvIGRlIGZ1bmNpw7NuLgpgYGB7cn0KZ2dwbG90KGRlYXRoc19jbGluaWMxLCBhZXMoeCA9IGRhdGUsIHkgPSBwcm9wb3J0aW9uX2RlYXRocywgY29sb3IgPSBoYW5kd2FzaGluZ19zdGFydGVkKSkgKwogIGdlb21fbGluZSgpICsKICBsYWJzKHRpdGxlID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMgZW4gbGEgQ2zDrW5pY2EgMSIsCiAgICAgICB4ID0gIkZlY2hhIiwKICAgICAgIHkgPSAiUHJvcG9yY2nDs24gZGUgbXVlcnRlcyIpCmBgYAojIyA5LjIgUGFyYSBjYWRhIGFuw6FsaXNpcyBlc3RhZMOtc3RpY28gcXVlIHByb3BvcmNpb25lIGNvbmNsdXlhIGVuIGZ1bmNpw7NuIGRlIGxvcyByZXN1bHRhZG9zIG9idGVuaWRvcy4KYGBge3J9CmdncGxvdChkZWF0aHNfY2xpbmljMSwgYWVzKHggPSBkYXRlLCB5ID0gcHJvcG9ydGlvbl9kZWF0aHMsIGNvbG9yID0gaGFuZHdhc2hpbmdfc3RhcnRlZCkpICsKICBnZW9tX2xpbmUoKSArCiAgbGFicyh0aXRsZSA9ICJQcm9wb3JjacOzbiBkZSBtdWVydGVzIGVuIGxhIENsw61uaWNhIDEiLAogICAgICAgeCA9ICJGZWNoYSIsCiAgICAgICB5ID0gIlByb3BvcmNpw7NuIGRlIG11ZXJ0ZXMiKQpgYGA=